import os
import requests
import pandas as pd

def download_attachments_from_excel(excel_file, url_column='url', output_folder='report'):
    """
    从 Excel 中读取 URL 列并下载附件到指定目录。

    :param excel_file: str - Excel 文件路径。
    :param url_column: str - 包含 URL 的列名，默认为 'url'。
    :param output_folder: str - 保存附件的目标目录。
    """
    # 创建输出目录（如果不存在）
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 读取 Excel 数据
    df = pd.read_excel(excel_file)

    # 检查是否有目标列
    if url_column not in df.columns:
        raise KeyError(f"Excel 中未找到列名: {url_column}")

    # 遍历每一行
    for index, row in df.iterrows():
        url = row[url_column]

        if pd.isna(url) or not isinstance(url, str):
            print(f"第 {index + 1} 行 URL 无效或为空，跳过...")
            continue

        try:
            response = requests.get(url, timeout=10)
            response.raise_for_status()  # 检查请求是否成功

            # 提取文件名（使用 URL 最后一部分）
            filename = os.path.join(output_folder, os.path.basename(url))

            # 写入文件
            with open(filename, 'wb') as f:
                f.write(response.content)

            print(f"已下载: {url} -> {filename}")
        except Exception as e:
            print(f"第 {index + 1} 行 下载失败: {url}，错误: {e}")

# 使用示例
if __name__ == "__main__":
    excel_path = "F:\\report\\report.xlsx"       # 替换为你的 Excel 文件路径
    output_dir = "F:\\report\\"  # 替换为你想保存附件的目录
    download_attachments_from_excel(excel_path, output_folder=output_dir)
